/** \file gpio.h
 * \brief Header for gpio.c
 * \details Header for gpio.c
 * \author Freddie Chopin, http://www.freddiechopin.info/
 * \date 2012-03-17
 */

/******************************************************************************
* chip: STM32F4x
* compiler: arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors) 4.6.2
* 	20110921 (release) [ARM/embedded-4_6-branch revision 182083]
******************************************************************************/

#ifndef GPIO_H_
#define GPIO_H_

#include "stm32f4xx.h"

#include "hdr_gpio.h"

/*
+=============================================================================+
| global definitions
+=============================================================================+
*/

#define GPIO_COMBINE(moder, otyper, ospeedr, pupdr, afr)	((moder) | ((otyper) << 4) | ((ospeedr) << 8) | ((pupdr) << 12) | ((afr) << 16))

// all possible configurations of GPIO

// input configurations
#define GPIO_IN_FLOATING					GPIO_COMBINE(GPIO_MODER_IN_value, 0, 0, GPIO_PUPDR_FLOATING_value, 0)
#define GPIO_IN_PULL_UP						GPIO_COMBINE(GPIO_MODER_IN_value, 0, 0, GPIO_PUPDR_PULL_UP_value, 0)
#define GPIO_IN_PULL_DOWN					GPIO_COMBINE(GPIO_MODER_IN_value, 0, 0, GPIO_PUPDR_PULL_DOWN_value, 0)

// output configurations
#define GPIO_OUT_PP_2MHz					GPIO_COMBINE(GPIO_MODER_OUT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, 0)
#define GPIO_OUT_PP_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_OUT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, 0)
#define GPIO_OUT_PP_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_OUT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, 0)
#define GPIO_OUT_PP_25MHz					GPIO_COMBINE(GPIO_MODER_OUT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, 0)
#define GPIO_OUT_PP_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_OUT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, 0)
#define GPIO_OUT_PP_25MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_OUT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, 0)
#define GPIO_OUT_PP_50MHz					GPIO_COMBINE(GPIO_MODER_OUT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, 0)
#define GPIO_OUT_PP_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_OUT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, 0)
#define GPIO_OUT_PP_50MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_OUT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, 0)
#define GPIO_OUT_PP_100MHz					GPIO_COMBINE(GPIO_MODER_OUT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, 0)
#define GPIO_OUT_PP_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_OUT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, 0)
#define GPIO_OUT_PP_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_OUT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, 0)
#define GPIO_OUT_OD_2MHz					GPIO_COMBINE(GPIO_MODER_OUT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, 0)
#define GPIO_OUT_OD_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_OUT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, 0)
#define GPIO_OUT_OD_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_OUT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, 0)
#define GPIO_OUT_OD_25MHz					GPIO_COMBINE(GPIO_MODER_OUT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, 0)
#define GPIO_OUT_OD_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_OUT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, 0)
#define GPIO_OUT_OD_25MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_OUT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, 0)
#define GPIO_OUT_OD_50MHz					GPIO_COMBINE(GPIO_MODER_OUT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, 0)
#define GPIO_OUT_OD_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_OUT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, 0)
#define GPIO_OUT_OD_50MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_OUT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, 0)
#define GPIO_OUT_OD_100MHz					GPIO_COMBINE(GPIO_MODER_OUT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, 0)
#define GPIO_OUT_OD_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_OUT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, 0)
#define GPIO_OUT_OD_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_OUT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, 0)

// alternate function configurations
#define GPIO_AF0_PP_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF0_value)
#define GPIO_AF0_PP_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF0_value)
#define GPIO_AF0_PP_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF0_value)
#define GPIO_AF0_PP_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF0_value)
#define GPIO_AF0_PP_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF0_value)
#define GPIO_AF0_PP_25MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF0_value)
#define GPIO_AF0_PP_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF0_value)
#define GPIO_AF0_PP_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF0_value)
#define GPIO_AF0_PP_50MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF0_value)
#define GPIO_AF0_PP_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF0_value)
#define GPIO_AF0_PP_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF0_value)
#define GPIO_AF0_PP_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF0_value)
#define GPIO_AF0_OD_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF0_value)
#define GPIO_AF0_OD_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF0_value)
#define GPIO_AF0_OD_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF0_value)
#define GPIO_AF0_OD_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF0_value)
#define GPIO_AF0_OD_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF0_value)
#define GPIO_AF0_OD_25MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF0_value)
#define GPIO_AF0_OD_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF0_value)
#define GPIO_AF0_OD_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF0_value)
#define GPIO_AF0_OD_50MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF0_value)
#define GPIO_AF0_OD_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF0_value)
#define GPIO_AF0_OD_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF0_value)
#define GPIO_AF0_OD_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF0_value)

#define GPIO_AF1_PP_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF1_value)
#define GPIO_AF1_PP_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF1_value)
#define GPIO_AF1_PP_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF1_value)
#define GPIO_AF1_PP_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF1_value)
#define GPIO_AF1_PP_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF1_value)
#define GPIO_AF1_PP_25MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF1_value)
#define GPIO_AF1_PP_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF1_value)
#define GPIO_AF1_PP_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF1_value)
#define GPIO_AF1_PP_50MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF1_value)
#define GPIO_AF1_PP_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF1_value)
#define GPIO_AF1_PP_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF1_value)
#define GPIO_AF1_PP_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF1_value)
#define GPIO_AF1_OD_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF1_value)
#define GPIO_AF1_OD_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF1_value)
#define GPIO_AF1_OD_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF1_value)
#define GPIO_AF1_OD_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF1_value)
#define GPIO_AF1_OD_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF1_value)
#define GPIO_AF1_OD_25MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF1_value)
#define GPIO_AF1_OD_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF1_value)
#define GPIO_AF1_OD_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF1_value)
#define GPIO_AF1_OD_50MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF1_value)
#define GPIO_AF1_OD_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF1_value)
#define GPIO_AF1_OD_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF1_value)
#define GPIO_AF1_OD_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF1_value)

#define GPIO_AF2_PP_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF2_value)
#define GPIO_AF2_PP_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF2_value)
#define GPIO_AF2_PP_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF2_value)
#define GPIO_AF2_PP_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF2_value)
#define GPIO_AF2_PP_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF2_value)
#define GPIO_AF2_PP_25MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF2_value)
#define GPIO_AF2_PP_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF2_value)
#define GPIO_AF2_PP_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF2_value)
#define GPIO_AF2_PP_50MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF2_value)
#define GPIO_AF2_PP_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF2_value)
#define GPIO_AF2_PP_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF2_value)
#define GPIO_AF2_PP_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF2_value)
#define GPIO_AF2_OD_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF2_value)
#define GPIO_AF2_OD_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF2_value)
#define GPIO_AF2_OD_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF2_value)
#define GPIO_AF2_OD_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF2_value)
#define GPIO_AF2_OD_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF2_value)
#define GPIO_AF2_OD_25MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF2_value)
#define GPIO_AF2_OD_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF2_value)
#define GPIO_AF2_OD_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF2_value)
#define GPIO_AF2_OD_50MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF2_value)
#define GPIO_AF2_OD_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF2_value)
#define GPIO_AF2_OD_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF2_value)
#define GPIO_AF2_OD_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF2_value)

#define GPIO_AF3_PP_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF3_value)
#define GPIO_AF3_PP_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF3_value)
#define GPIO_AF3_PP_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF3_value)
#define GPIO_AF3_PP_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF3_value)
#define GPIO_AF3_PP_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF3_value)
#define GPIO_AF3_PP_25MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF3_value)
#define GPIO_AF3_PP_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF3_value)
#define GPIO_AF3_PP_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF3_value)
#define GPIO_AF3_PP_50MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF3_value)
#define GPIO_AF3_PP_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF3_value)
#define GPIO_AF3_PP_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF3_value)
#define GPIO_AF3_PP_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF3_value)
#define GPIO_AF3_OD_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF3_value)
#define GPIO_AF3_OD_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF3_value)
#define GPIO_AF3_OD_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF3_value)
#define GPIO_AF3_OD_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF3_value)
#define GPIO_AF3_OD_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF3_value)
#define GPIO_AF3_OD_25MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF3_value)
#define GPIO_AF3_OD_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF3_value)
#define GPIO_AF3_OD_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF3_value)
#define GPIO_AF3_OD_50MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF3_value)
#define GPIO_AF3_OD_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF3_value)
#define GPIO_AF3_OD_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF3_value)
#define GPIO_AF3_OD_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF3_value)

#define GPIO_AF4_PP_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF4_value)
#define GPIO_AF4_PP_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF4_value)
#define GPIO_AF4_PP_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF4_value)
#define GPIO_AF4_PP_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF4_value)
#define GPIO_AF4_PP_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF4_value)
#define GPIO_AF4_PP_25MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF4_value)
#define GPIO_AF4_PP_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF4_value)
#define GPIO_AF4_PP_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF4_value)
#define GPIO_AF4_PP_50MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF4_value)
#define GPIO_AF4_PP_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF4_value)
#define GPIO_AF4_PP_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF4_value)
#define GPIO_AF4_PP_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF4_value)
#define GPIO_AF4_OD_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF4_value)
#define GPIO_AF4_OD_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF4_value)
#define GPIO_AF4_OD_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF4_value)
#define GPIO_AF4_OD_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF4_value)
#define GPIO_AF4_OD_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF4_value)
#define GPIO_AF4_OD_25MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF4_value)
#define GPIO_AF4_OD_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF4_value)
#define GPIO_AF4_OD_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF4_value)
#define GPIO_AF4_OD_50MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF4_value)
#define GPIO_AF4_OD_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF4_value)
#define GPIO_AF4_OD_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF4_value)
#define GPIO_AF4_OD_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF4_value)

#define GPIO_AF5_PP_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF5_value)
#define GPIO_AF5_PP_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF5_value)
#define GPIO_AF5_PP_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF5_value)
#define GPIO_AF5_PP_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF5_value)
#define GPIO_AF5_PP_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF5_value)
#define GPIO_AF5_PP_25MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF5_value)
#define GPIO_AF5_PP_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF5_value)
#define GPIO_AF5_PP_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF5_value)
#define GPIO_AF5_PP_50MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF5_value)
#define GPIO_AF5_PP_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF5_value)
#define GPIO_AF5_PP_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF5_value)
#define GPIO_AF5_PP_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF5_value)
#define GPIO_AF5_OD_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF5_value)
#define GPIO_AF5_OD_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF5_value)
#define GPIO_AF5_OD_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF5_value)
#define GPIO_AF5_OD_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF5_value)
#define GPIO_AF5_OD_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF5_value)
#define GPIO_AF5_OD_25MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF5_value)
#define GPIO_AF5_OD_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF5_value)
#define GPIO_AF5_OD_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF5_value)
#define GPIO_AF5_OD_50MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF5_value)
#define GPIO_AF5_OD_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF5_value)
#define GPIO_AF5_OD_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF5_value)
#define GPIO_AF5_OD_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF5_value)

#define GPIO_AF6_PP_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF6_value)
#define GPIO_AF6_PP_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF6_value)
#define GPIO_AF6_PP_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF6_value)
#define GPIO_AF6_PP_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF6_value)
#define GPIO_AF6_PP_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF6_value)
#define GPIO_AF6_PP_25MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF6_value)
#define GPIO_AF6_PP_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF6_value)
#define GPIO_AF6_PP_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF6_value)
#define GPIO_AF6_PP_50MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF6_value)
#define GPIO_AF6_PP_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF6_value)
#define GPIO_AF6_PP_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF6_value)
#define GPIO_AF6_PP_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF6_value)
#define GPIO_AF6_OD_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF6_value)
#define GPIO_AF6_OD_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF6_value)
#define GPIO_AF6_OD_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF6_value)
#define GPIO_AF6_OD_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF6_value)
#define GPIO_AF6_OD_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF6_value)
#define GPIO_AF6_OD_25MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF6_value)
#define GPIO_AF6_OD_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF6_value)
#define GPIO_AF6_OD_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF6_value)
#define GPIO_AF6_OD_50MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF6_value)
#define GPIO_AF6_OD_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF6_value)
#define GPIO_AF6_OD_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF6_value)
#define GPIO_AF6_OD_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF6_value)

#define GPIO_AF7_PP_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF7_value)
#define GPIO_AF7_PP_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF7_value)
#define GPIO_AF7_PP_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF7_value)
#define GPIO_AF7_PP_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF7_value)
#define GPIO_AF7_PP_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF7_value)
#define GPIO_AF7_PP_25MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF7_value)
#define GPIO_AF7_PP_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF7_value)
#define GPIO_AF7_PP_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF7_value)
#define GPIO_AF7_PP_50MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF7_value)
#define GPIO_AF7_PP_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF7_value)
#define GPIO_AF7_PP_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF7_value)
#define GPIO_AF7_PP_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF7_value)
#define GPIO_AF7_OD_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF7_value)
#define GPIO_AF7_OD_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF7_value)
#define GPIO_AF7_OD_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF7_value)
#define GPIO_AF7_OD_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF7_value)
#define GPIO_AF7_OD_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF7_value)
#define GPIO_AF7_OD_25MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF7_value)
#define GPIO_AF7_OD_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF7_value)
#define GPIO_AF7_OD_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF7_value)
#define GPIO_AF7_OD_50MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF7_value)
#define GPIO_AF7_OD_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF7_value)
#define GPIO_AF7_OD_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF7_value)
#define GPIO_AF7_OD_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF7_value)

#define GPIO_AF8_PP_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF8_value)
#define GPIO_AF8_PP_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF8_value)
#define GPIO_AF8_PP_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF8_value)
#define GPIO_AF8_PP_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF8_value)
#define GPIO_AF8_PP_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF8_value)
#define GPIO_AF8_PP_25MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF8_value)
#define GPIO_AF8_PP_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF8_value)
#define GPIO_AF8_PP_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF8_value)
#define GPIO_AF8_PP_50MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF8_value)
#define GPIO_AF8_PP_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF8_value)
#define GPIO_AF8_PP_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF8_value)
#define GPIO_AF8_PP_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF8_value)
#define GPIO_AF8_OD_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF8_value)
#define GPIO_AF8_OD_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF8_value)
#define GPIO_AF8_OD_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF8_value)
#define GPIO_AF8_OD_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF8_value)
#define GPIO_AF8_OD_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF8_value)
#define GPIO_AF8_OD_25MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF8_value)
#define GPIO_AF8_OD_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF8_value)
#define GPIO_AF8_OD_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF8_value)
#define GPIO_AF8_OD_50MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF8_value)
#define GPIO_AF8_OD_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF8_value)
#define GPIO_AF8_OD_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF8_value)
#define GPIO_AF8_OD_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF8_value)

#define GPIO_AF9_PP_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF9_value)
#define GPIO_AF9_PP_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF9_value)
#define GPIO_AF9_PP_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF9_value)
#define GPIO_AF9_PP_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF9_value)
#define GPIO_AF9_PP_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF9_value)
#define GPIO_AF9_PP_25MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF9_value)
#define GPIO_AF9_PP_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF9_value)
#define GPIO_AF9_PP_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF9_value)
#define GPIO_AF9_PP_50MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF9_value)
#define GPIO_AF9_PP_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF9_value)
#define GPIO_AF9_PP_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF9_value)
#define GPIO_AF9_PP_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF9_value)
#define GPIO_AF9_OD_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF9_value)
#define GPIO_AF9_OD_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF9_value)
#define GPIO_AF9_OD_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF9_value)
#define GPIO_AF9_OD_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF9_value)
#define GPIO_AF9_OD_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF9_value)
#define GPIO_AF9_OD_25MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF9_value)
#define GPIO_AF9_OD_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF9_value)
#define GPIO_AF9_OD_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF9_value)
#define GPIO_AF9_OD_50MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF9_value)
#define GPIO_AF9_OD_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF9_value)
#define GPIO_AF9_OD_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF9_value)
#define GPIO_AF9_OD_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF9_value)

#define GPIO_AF10_PP_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF10_value)
#define GPIO_AF10_PP_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF10_value)
#define GPIO_AF10_PP_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF10_value)
#define GPIO_AF10_PP_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF10_value)
#define GPIO_AF10_PP_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF10_value)
#define GPIO_AF10_PP_25MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF10_value)
#define GPIO_AF10_PP_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF10_value)
#define GPIO_AF10_PP_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF10_value)
#define GPIO_AF10_PP_50MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF10_value)
#define GPIO_AF10_PP_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF10_value)
#define GPIO_AF10_PP_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF10_value)
#define GPIO_AF10_PP_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF10_value)
#define GPIO_AF10_OD_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF10_value)
#define GPIO_AF10_OD_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF10_value)
#define GPIO_AF10_OD_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF10_value)
#define GPIO_AF10_OD_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF10_value)
#define GPIO_AF10_OD_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF10_value)
#define GPIO_AF10_OD_25MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF10_value)
#define GPIO_AF10_OD_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF10_value)
#define GPIO_AF10_OD_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF10_value)
#define GPIO_AF10_OD_50MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF10_value)
#define GPIO_AF10_OD_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF10_value)
#define GPIO_AF10_OD_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF10_value)
#define GPIO_AF10_OD_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF10_value)

#define GPIO_AF11_PP_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF11_value)
#define GPIO_AF11_PP_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF11_value)
#define GPIO_AF11_PP_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF11_value)
#define GPIO_AF11_PP_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF11_value)
#define GPIO_AF11_PP_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF11_value)
#define GPIO_AF11_PP_25MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF11_value)
#define GPIO_AF11_PP_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF11_value)
#define GPIO_AF11_PP_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF11_value)
#define GPIO_AF11_PP_50MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF11_value)
#define GPIO_AF11_PP_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF11_value)
#define GPIO_AF11_PP_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF11_value)
#define GPIO_AF11_PP_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF11_value)
#define GPIO_AF11_OD_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF11_value)
#define GPIO_AF11_OD_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF11_value)
#define GPIO_AF11_OD_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF11_value)
#define GPIO_AF11_OD_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF11_value)
#define GPIO_AF11_OD_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF11_value)
#define GPIO_AF11_OD_25MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF11_value)
#define GPIO_AF11_OD_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF11_value)
#define GPIO_AF11_OD_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF11_value)
#define GPIO_AF11_OD_50MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF11_value)
#define GPIO_AF11_OD_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF11_value)
#define GPIO_AF11_OD_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF11_value)
#define GPIO_AF11_OD_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF11_value)

#define GPIO_AF12_PP_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF12_value)
#define GPIO_AF12_PP_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF12_value)
#define GPIO_AF12_PP_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF12_value)
#define GPIO_AF12_PP_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF12_value)
#define GPIO_AF12_PP_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF12_value)
#define GPIO_AF12_PP_25MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF12_value)
#define GPIO_AF12_PP_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF12_value)
#define GPIO_AF12_PP_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF12_value)
#define GPIO_AF12_PP_50MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF12_value)
#define GPIO_AF12_PP_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF12_value)
#define GPIO_AF12_PP_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF12_value)
#define GPIO_AF12_PP_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF12_value)
#define GPIO_AF12_OD_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF12_value)
#define GPIO_AF12_OD_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF12_value)
#define GPIO_AF12_OD_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF12_value)
#define GPIO_AF12_OD_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF12_value)
#define GPIO_AF12_OD_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF12_value)
#define GPIO_AF12_OD_25MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF12_value)
#define GPIO_AF12_OD_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF12_value)
#define GPIO_AF12_OD_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF12_value)
#define GPIO_AF12_OD_50MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF12_value)
#define GPIO_AF12_OD_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF12_value)
#define GPIO_AF12_OD_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF12_value)
#define GPIO_AF12_OD_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF12_value)

#define GPIO_AF13_PP_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF13_value)
#define GPIO_AF13_PP_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF13_value)
#define GPIO_AF13_PP_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF13_value)
#define GPIO_AF13_PP_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF13_value)
#define GPIO_AF13_PP_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF13_value)
#define GPIO_AF13_PP_25MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF13_value)
#define GPIO_AF13_PP_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF13_value)
#define GPIO_AF13_PP_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF13_value)
#define GPIO_AF13_PP_50MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF13_value)
#define GPIO_AF13_PP_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF13_value)
#define GPIO_AF13_PP_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF13_value)
#define GPIO_AF13_PP_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF13_value)
#define GPIO_AF13_OD_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF13_value)
#define GPIO_AF13_OD_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF13_value)
#define GPIO_AF13_OD_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF13_value)
#define GPIO_AF13_OD_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF13_value)
#define GPIO_AF13_OD_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF13_value)
#define GPIO_AF13_OD_25MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF13_value)
#define GPIO_AF13_OD_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF13_value)
#define GPIO_AF13_OD_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF13_value)
#define GPIO_AF13_OD_50MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF13_value)
#define GPIO_AF13_OD_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF13_value)
#define GPIO_AF13_OD_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF13_value)
#define GPIO_AF13_OD_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF13_value)

#define GPIO_AF14_PP_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF14_value)
#define GPIO_AF14_PP_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF14_value)
#define GPIO_AF14_PP_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF14_value)
#define GPIO_AF14_PP_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF14_value)
#define GPIO_AF14_PP_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF14_value)
#define GPIO_AF14_PP_25MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF14_value)
#define GPIO_AF14_PP_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF14_value)
#define GPIO_AF14_PP_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF14_value)
#define GPIO_AF14_PP_50MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF14_value)
#define GPIO_AF14_PP_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF14_value)
#define GPIO_AF14_PP_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF14_value)
#define GPIO_AF14_PP_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF14_value)
#define GPIO_AF14_OD_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF14_value)
#define GPIO_AF14_OD_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF14_value)
#define GPIO_AF14_OD_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF14_value)
#define GPIO_AF14_OD_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF14_value)
#define GPIO_AF14_OD_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF14_value)
#define GPIO_AF14_OD_25MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF14_value)
#define GPIO_AF14_OD_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF14_value)
#define GPIO_AF14_OD_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF14_value)
#define GPIO_AF14_OD_50MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF14_value)
#define GPIO_AF14_OD_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF14_value)
#define GPIO_AF14_OD_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF14_value)
#define GPIO_AF14_OD_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF14_value)

#define GPIO_AF15_PP_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF15_value)
#define GPIO_AF15_PP_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF15_value)
#define GPIO_AF15_PP_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF15_value)
#define GPIO_AF15_PP_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF15_value)
#define GPIO_AF15_PP_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF15_value)
#define GPIO_AF15_PP_25MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF15_value)
#define GPIO_AF15_PP_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF15_value)
#define GPIO_AF15_PP_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF15_value)
#define GPIO_AF15_PP_50MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF15_value)
#define GPIO_AF15_PP_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF15_value)
#define GPIO_AF15_PP_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF15_value)
#define GPIO_AF15_PP_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_PP_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF15_value)
#define GPIO_AF15_OD_2MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF15_value)
#define GPIO_AF15_OD_2MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF15_value)
#define GPIO_AF15_OD_2MHz_PULL_DOWN			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_2MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF15_value)
#define GPIO_AF15_OD_25MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF15_value)
#define GPIO_AF15_OD_25MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF15_value)
#define GPIO_AF15_OD_25MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_25MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF15_value)
#define GPIO_AF15_OD_50MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF15_value)
#define GPIO_AF15_OD_50MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF15_value)
#define GPIO_AF15_OD_50MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_50MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF15_value)
#define GPIO_AF15_OD_100MHz					GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_FLOATING_value, GPIO_AFRx_AF15_value)
#define GPIO_AF15_OD_100MHz_PULL_UP			GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_UP_value, GPIO_AFRx_AF15_value)
#define GPIO_AF15_OD_100MHz_PULL_DOWN		GPIO_COMBINE(GPIO_MODER_ALT_value, GPIO_OTYPER_OD_value, GPIO_OSPEEDR_100MHz_value, GPIO_PUPDR_PULL_DOWN_value, GPIO_AFRx_AF15_value)

// analog configuration
#define GPIO_ANALOG							GPIO_COMBINE(GPIO_MODER_ANALOG_value, 0, 0, GPIO_PUPDR_FLOATING_value, 0)

/*
+=============================================================================+
| strange variables
+=============================================================================+
*/

/*
+=============================================================================+
| global variables
+=============================================================================+
*/

/*
+=============================================================================+
| global functions' declarations
+=============================================================================+
*/

void gpio_init(void);
void gpio_pin_cfg(GPIO_TypeDef *port_ptr, uint32_t pin, uint32_t configuration);

/******************************************************************************
* END OF FILE
******************************************************************************/
#endif /* GPIO_H_ */
